import json
sft = []
prompt = """
你是一位专业且有帮助的AI助手,专注于理解并调用API工具来解答用户的问题,你的回答需要科学严谨、严格符合输出格式,具体要求如下:

1.**定义:**
    - **api列表的定义:**你会收到一个api列表,里面存有若干可以调用的api,api的'description'字段表示这个api的功能,'parameters'字段'表示调用时应该填入的参数.
    - **user_messages列表的定义:**user_messages列表表示用户提出的若干需求,这些需求可能包含了需要调用的api的参数.

2.**任务内容:**
    -你需要从头开始逐一分析user_messages列表里的每一个元素,每一个元素代表一句需求
    -首先思考用户的需求需要你调用哪几个api,对于每一个元素都要认真判断
    -然后思考在第几个元素的时候你获得了调用这些api所需的全部参数
    -最后思考用什么样的正确格式填入参数
    -想象你的输出是对于用户每句话的回复,但是你只在获得了足够调用这些api的全部参数时回复仅仅一次内容,其他时候你回复空列表
    -注意你的整个输出列表长度必须和user_messages列表相等!

3.**输出格式要求:**
    -你需要输出一个列表,这个列表的长度和user_messages列表相等!表示对于用户的每一句话做出的回应.
    -这个列表的全部元素都是列表,但是只有一个列表是非空列表.
    -这个非空列表出现的位置就是你认为的已经获得足够可以调用若干个api的参数的那句user_messages对应的位置.
    -非空列表中有若干个字典,每个字典的key有两个,分别是"name"表示api名称,以及"arguments"表示api需要填入的参数
    -你可以只调用一个api,或者调用一个api多次,或者调用多个不同的api来回答,但是输出列表只能有一个非空元素表示你回答的那轮对话
    -你必须回答格式化的输出,输出必须能被python的eval()函数转化,不可以带有中文标点符号,不可以缺少必要的中括号和大括号!
    
4.**演示示例:**
    -**输入示例:**
{"id": "827", "apis": [{"name": "query_token_balance", "description": "查询指定地址在特定区块链上的代币余额.", "parameters": {"type": "object", "properties": {"product_id": {"type": "string", "description": "钱包的区块链地址"}, "token_contract_address": {"type": "string", "description": "代币的智能合约地址"}, "network": {"type": "string", "description": "区块链网络名称"}, "include_usd_value": {"type": "boolean", "description": "是否包含以美元计算的余额价值", "default": false}, "decimals": {"type": "nteger", "description": "产品是否激活", "default": true}}, "required": ["wallet_address", "token_contract_address", "network"]}}, {"name": "milk_quality_analysis", "description": "分析牛奶的质量,包括成分和卫生指标", "parameters": {"type": "object", "properties": {"fat_content": {"type": "number", "description": "牛奶中的脂肪含量（百分比）"}, "protein_content": {"type": "number", "description": "牛奶中的蛋白质含量（百分比）"}, "lactose_content": {"type": "number", "description": "牛奶中的乳糖含量（百分比）"}, "somatic_cell_count": {"type": "number", "description": "牛奶中的体细胞数（每毫升）"}, "total_bacterial_count": {"type": "number", "description": "牛奶中的总细菌数（每毫升）"}}, "required": ["fat_content", "protein_content", "lactose_content", "somatic_cell_count", "total_bacterial_count"]}}, {"name": "monitor_machine_health", "description": "监控机器设备的健康状态,减少故障和停机时间", "parameters": {"type": "object", "properties": {"machine_id": {"type": "string", "description": "机器设备的唯一标识符"}, "vibration_levels": {"type": "number", "description": "机器运作时的振动幅度"}, "temperature": {"type": "number", "description": "机器运作时的温度"}, "operating_hours": {"type": "number", "description": "机器已连续运行的小时数"}, "include_downtime_analysis": {"type": "boolean", "description": "是否包括停机分析报告"}}, "required": ["machine_id", "vibration_levels", "temperature", "operating_hours", "include_downtime_analysis"]}}], "user_messages": ["你好", "我想查一下钱包地址0x742d35Cc6634C0532925a3b844Bc454e4438f44e在Ethereum网络上,代币合约地址为0x1985365e9f78359a9B6AD760e32412f4a445E862的代币余额,并且需要包含以美元计算的余额价值,代币的小数位数是18.另外,我还想查一下钱包地址bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq在Bitcoin网络上,代币合约地址为0x6B175474E89094C44Da98b954EedeAC495271d0F的代币余额."]}
    --**输出示例:**
[[],[{"name": "query_token_balance","arguments": {"wallet_address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", "token_contract_address": "0x1985365e9f78359a9B6AD760e32412f4a445E862", "network": "Ethereum", "include_usd_value": true, "decimals": 18}}, {"name": "query_token_balance","arguments": {"wallet_address": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq", "token_contract_address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", "network": "Bitcoin"}}]]

5.**以下是我的正式输入,请开始任务:**
"""
with open("0319shuffled_output.jsonl", "r", encoding="utf-8") as f:
    for line in f:  # 逐行读取
        # 将字符串解析为字典
        original_data = json.loads(line.strip())  # 注意要 strip() 去掉换行符
        
        # 构建新字典
        new_entry = {
            "instruction": str(prompt),  # 注意这里的 prompt 需要提前定义
            "output": str(original_data["targets"]),
            "input": str({k: v for k, v in original_data.items() if k != "targets"})
        }
        sft.append(new_entry)

with open("0319sft.json", "w", encoding="utf-8") as f:
    json.dump(sft, f, ensure_ascii=False, indent=2)